/*
 * aye.cpp
 *
 *  Created on: 24/03/2014
 *      Author: Juan
 */

#include "aye.h"
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <string>
#include <iostream>
#include <sstream>

using namespace std;

void readShort(short VAR enteroCorto) {
	short value;
	string line;
	while (true) {
		getline(cin, line);
		istringstream stream(line);
		stream >> value >> ws;
		if (!stream.fail() && stream.eof())
			break;
		cout << "Formato de entero corto incorrecto. Intente nuevamente." << endl;
	}
	enteroCorto = value;
}

void readUnsignedShort(unsigned short VAR enteroCortoSinSigno) {
	unsigned short value;
	string line;
	while (true) {
		getline(cin, line);
		istringstream stream(line);
		stream >> value >> ws;
		if (!stream.fail() && stream.eof())
			break;
		cout << "Formato de entero corto sin signo incorrecto. Intente nuevamente." << endl;
	}
	enteroCortoSinSigno = value;
}

void readInteger(int VAR entero) {
	int value;
	string line;
	while (true) {
		getline(cin, line);
		istringstream stream(line);
		stream >> value >> ws;
		if (!stream.fail() && stream.eof())
			break;
		cout << "Formato de entero incorrecto. Intente nuevamente." << endl;
	}
	entero = value;
}

void readUnsignedInteger(unsigned int VAR enteroSinSigno) {
	unsigned int value;
	string line;
	while (true) {
		getline(cin, line);
		istringstream stream(line);
		stream >> value >> ws;
		if (!stream.fail() && stream.eof())
			break;
		cout << "Formato de entero sin signo incorrecto. Intente nuevamente." << endl;
	}
	enteroSinSigno = value;
}

void readLong(long VAR enteroLargo) {
	long value;
	string line;
	while (true) {
		getline(cin, line);
		istringstream stream(line);
		stream >> value >> ws;
		if (!stream.fail() && stream.eof())
			break;
		cout << "Formato de entero largo incorrecto. Intente nuevamente." << endl;
	}
	enteroLargo = value;
}

void readUnsignedLong(unsigned long VAR enteroLargoSinSigno) {
	unsigned long value;
	string line;
	while (true) {
		getline(cin, line);
		istringstream stream(line);
		stream >> value >> ws;
		if (!stream.fail() && stream.eof())
			break;
		cout << "Formato de entero largo sin signo incorrecto. Intente nuevamente." << endl;
	}
	enteroLargoSinSigno = value;
}



void readFloat(float VAR real) {
	float value;
	string line;
	while (true) {
		getline(cin, line);
		istringstream stream(line);
		stream >> value >> ws;
		if (!stream.fail() && stream.eof())
			break;
		cout << "Formato de real incorrecto. Intente nuevamente." << endl;
	}
	real = value;
}

void readDouble(double VAR real) {
	double value;
	string line;
	while (true) {
		getline(cin, line);
		istringstream stream(line);
		stream >> value >> ws;
		if (!stream.fail() && stream.eof())
			break;
		cout << "Formato de real incorrecto. Intente nuevamente." << endl;
	}
	real = value;
}

void readLongDouble(long double VAR real) {
	long double value;
	string line;
	while (true) {
		getline(cin, line);
		istringstream stream(line);
		stream >> value >> ws;
		if (!stream.fail() && stream.eof())
			break;
		cout << "Formato de real incorrecto. Intente nuevamente." << endl;
	}
	real = value;
}

void readChar(char VAR caracter) {
	char value;
	string line;
	while (true) {
		getline(cin, line);
		istringstream stream(line);
		stream >> value >> ws;
		if (!stream.fail() && stream.eof())
			break;
		cout << "Formato de caracter incorrecto. Intente nuevamente." << endl;
	}
	caracter = value;
}
void readString(string VAR cadena) {
	string line;
	getline(cin, line);

	cadena.assign(line);
}

void writeString(string cadena) {
	printf("%s", cadena.c_str());
}

/*void writeString(const char* cadena, ...) {
	va_list arg;
	va_start(arg, cadena);
	vprintf(cadena, arg);
	va_end(arg);
}
*/
void writeLnString(string cadena) {
	printf("%s\n", cadena.c_str());
}

/*
void writeLnString(const char* cadena, ...) {
	char newFormat [strlen(cadena) + 2];
	strcpy(newFormat, cadena);
	strcat(newFormat, "\n");

	cadena = newFormat;
	va_list arg;
	va_start(arg, cadena);
	vprintf(cadena, arg);
	va_end(arg);
}
*/

void writeCharString(char cadena[]) {
	printf("%s", cadena);
}

void writeLnCharString(char cadena[]) {
	printf("%s\n", cadena);
}

int getInteger(string prompt) {
	int value;
	string line;
	while (true) {
		cout << prompt;
		getline(cin, line);
		istringstream stream(line);
		stream >> value >> ws;
		if (!stream.fail() && stream.eof())
			break;
		cout << "Formato de entero incorrecto. Intente nuevamente." << endl;
	}
	return value;
}

double getReal(string prompt) {
	double value;
	string line;
	while (true) {
		cout << prompt;
		getline(cin, line);
		istringstream stream(line);
		stream >> value >> ws;
		if (!stream.fail() && stream.eof())
			break;
		cout << "Formato de real incorrecto. Intente nuevamente. " << endl;
	}
	return value;
}

string getLine(string prompt) {
	char line[1024];

	cout << prompt;

	cin.getline(line, 1024, '\n');

	//printf("Texto ingresado [%s]\n", line);
	return string(line);
}

void readCharString(char cadena[]) {

	string line = getLine();

	strcpy(cadena, line.c_str());
}

int sizeFileFunction(ARCHIVO archivo){
    int prev=ftell(archivo);
    fseek(archivo, 0L, SEEK_END);
    int sz=ftell(archivo);
    fseek(archivo,prev,SEEK_SET);
    return sz;
}

int feofAyE(ARCHIVO archivo){
    int prev=ftell(archivo);
    fseek(archivo, 0L, SEEK_END);
    int size=ftell(archivo);
    fseek(archivo,prev,SEEK_SET);
    return size == prev;
}
